/*
 * This file is part of aion-emu <aion-emu.com>.
 *
 * aion-emu is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * aion-emu is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with aion-emu.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.aionemu.gameserver.configs.network;

import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.aionemu.commons.network.IPRange;

/**
 * 
 * Class that is designed to read IPConfig.xml
 * 
 * @author Taran
 * @author SoulKeeper
 */
public class IPConfig
{

	/**
	 * Logger
	 */
	private static final Logger			log			= Logger.getLogger(IPConfig.class);

	/**
	 * Location of config file
	 */
	private static final String			CONFIG_FILE	= "./config/network/ipconfig.xml";

	/**
	 * List of all ip ranges
	 */
	private static final List<IPRange>	ranges		= new ArrayList<IPRange>();

	/**
	 * Default address
	 */
	private static byte[]				defaultAddress;

	/**
	 * Method that loads IPConfig
	 */
	public static void load()
	{
		try
		{
			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
			parser.parse(new File(CONFIG_FILE), new DefaultHandler(){

				@Override
				public void startElement(String uri, String localName, String qName, Attributes attributes)
					throws SAXException
				{

					if(qName.equals("ipconfig"))
					{
						try
						{
							defaultAddress = InetAddress.getByName(attributes.getValue("default")).getAddress();
						}
						catch(UnknownHostException e)
						{
							throw new RuntimeException("Failed to resolve DSN for address: "
								+ attributes.getValue("default"), e);
						}
					}
					else if(qName.equals("iprange"))
					{
						String min = attributes.getValue("min");
						String max = attributes.getValue("max");
						String address = attributes.getValue("address");
						IPRange ipRange = new IPRange(min, max, address);
						ranges.add(ipRange);
					}
				}
			});
		}
		catch(Exception e)
		{
			log.fatal("Critical error while parsing ipConfig", e);
			throw new Error("Can't load ipConfig", e);
		}
	}

	/**
	 * Returns list of ip ranges
	 * 
	 * @return list of ip ranges
	 */
	public static List<IPRange> getRanges()
	{
		return ranges;
	}

	/**
	 * Returns default address
	 * 
	 * @return default address
	 */
	public static byte[] getDefaultAddress()
	{
		return defaultAddress;
	}
}
